package com.fengyun.scala

/**
 * @author Hanpeng
 * @date 2021/1/22 14:40
 * @description: Class Any 是Scala class 层次结构中的根,每个class 都直接或者间接继承了这个类。
 *               (我们写的类都是间接继承了这个类)。从Scala 2.10开始,可以使用 universal traits来直接继承这个类。
 *               universal traits指的是可以def members,但是不能初始化(实际上指的是不能定义字段值 )。
 *               例如 val fff:Int=1 本可以;
 *               一个主要的用处是value class的方法的基本继承。
 */
object TestAny {
  def main(args: Array[String]): Unit = {
    val w = new WrapperHan(3);
    w.print();
    val han1:MyAnyHan = new MyAnyHan();
    val han2:MyAnyHan = new MyAnyHan();
    println("!=方法 ==> "+han1.!=(han2));
    println("!=方法 ==> 111"+han1!=han2); //这个方法和上面的方法不一样
    println(han1.hashCode())
    println(han1.##);//空参可以省略 等价于 x.hashCode(除了开箱数字类型和null)
    //println(null.hashCode())
    println(w.hashCode())
    println(w.##)
    println(han1.==(han2));//判断两个对象是否相等 等价于if (x eq null) that eq null else x.equals(that).
    //final def asInstanceOf[T0]: T0 转换成其T0类型

    //def equals(arg0: Any): Boolean  比较两个对象是否相等
    //
    //def hashCode(): Int 计算一个对象的hashcode

    //final def isInstanceOf[T0]: Boolean  //判断一个对象是否为T0类型
    //def toString(): String  //返回代表这个对象的字符串
    println(han1.toString);
    println(han1.hashCode());


  }


}
trait PrintableHan extends Any {
  def print(): Unit = println(this)
}
class WrapperHan(val underlying: Int) extends AnyVal with PrintableHan{

}
//最后变成了接口 对应三个方法
trait  TraitExtendsAnyDirect extends  Any {
  def print(): Unit = println(this)
  val fff:Int;
  def han():Int={
    12;
  }

}

class MyAnyHan() extends AnyRef with TraitExtendsAnyDirect{
  override val fff: Int = 1;
}
